package com.sz.szaiagent.rag;

import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.document.Document;
import org.springframework.ai.reader.markdown.MarkdownDocumentReader;
import org.springframework.ai.reader.markdown.config.MarkdownDocumentReaderConfig;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 恋爱应用文档加载器
 * 该类用于加载Markdown文档，结合MarkdownDocumentReader，提升文档的读取和处理效率。
 */
@Slf4j
@Component
public class LoveAppDocumentLoader {
    private final ResourcePatternResolver resourcePatternResolver;

    /**
     * 构造函数，初始化资源模式解析器
     * @param resourcePatternResolver 资源模式解析器，用于解析资源路径
     */
    LoveAppDocumentLoader(ResourcePatternResolver resourcePatternResolver){
        this.resourcePatternResolver = resourcePatternResolver;
    }

    /**
     * 加载Markdown文档
     * @return 加载的文档列表
     */
    public List<Document> loadMarkdowns(){
        List<Document> allDocuments = new ArrayList<>();
        try {
            Resource[] resources = resourcePatternResolver.getResources("classpath:document/*.md"); // 获取Markdown文档资源
            log.info("加载文档完成",resources);
            for(Resource resource:resources){
                String fileName = resource.getFilename(); // 获取文件名
                log.info("文档名称",fileName);
                MarkdownDocumentReaderConfig filename = MarkdownDocumentReaderConfig.builder()
                        //当遇到 Markdown 中的水平分隔线（如 --- 或 ***）时，将其视为新文档的开始
                        .withHorizontalRuleCreateDocument(true) // 设置水平分隔线创建文档
                        //读取 Markdown 时排除代码块内容
                        .withIncludeCodeBlock(false) // 设置是否包含代码块
                        //读取 Markdown 时排除引用块内容
                        .withIncludeBlockquote(false) // 设置是否包含引用块
                        //为读取的文档添加额外元数据（键值对）
                        .withAdditionalMetadata("filename", fileName) // 添加文件名元数据
                        .build(); // 构建MarkdownDocumentReaderConfig实例
                MarkdownDocumentReader markdownDocumentReader = new MarkdownDocumentReader(resource, filename); // 创建MarkdownDocumentReader实例
                allDocuments.addAll(markdownDocumentReader.get()); // 获取文档并添加到列表
            }

        }catch (IOException E){
            log.error("文档加载失败");
        }
        return allDocuments; // 返回加载的文档列表
    }
}
